package com.yimixian.app.location;

import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.yimixian.app.YMXApplication;

/**
 * 百度定位
 */
public class LocationProvider {

    private static final int DEFAULT_LOCATION_TIMEOUT_SECONDS = 12;
    private LocationClient mLocationClient;
    private LocationClientOption.LocationMode tempMode = LocationClientOption.LocationMode.Hight_Accuracy;
    private String tempcoor = "bd09ll";// 百度经纬度标准
    private int span = 1000;// 发起定位请求的间隔

    private static class SingletonHolder {
        /**
         * 单例对象实例
         */
        static final LocationProvider INSTANCE = new LocationProvider();
    }

    public static LocationProvider getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private void initLocation(LocatedListener locatedListener, boolean needGeoPoiInfo) {
        YMXApplication.getInstance().setLocatedListener(needGeoPoiInfo, locatedListener);
        mLocationClient = YMXApplication.getInstance().mLocationClient;
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(tempMode);// 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType(tempcoor);// 可选，默认gcj02，设置返回的定位结果坐标系，
        option.setScanSpan(span);// 可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);// 可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);// 可选，默认false,设置是否使用gps
        // option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIgnoreKillProcess(true);// 可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        // option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        // option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);// 可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setTimeOut(DEFAULT_LOCATION_TIMEOUT_SECONDS);// 设置超时无效
        mLocationClient.setLocOption(option);
    }
    private void initLocation(LocatedListener2 locatedListener, boolean needGeoPoiInfo) {
        YMXApplication.getInstance().setLocatedListener2(needGeoPoiInfo, locatedListener);
        mLocationClient = YMXApplication.getInstance().mLocationClient;
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(tempMode);// 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType(tempcoor);// 可选，默认gcj02，设置返回的定位结果坐标系，
        option.setScanSpan(span);// 可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);// 可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);// 可选，默认false,设置是否使用gps
        // option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIgnoreKillProcess(true);// 可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        // option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        // option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);// 可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setTimeOut(DEFAULT_LOCATION_TIMEOUT_SECONDS);// 设置超时无效
        mLocationClient.setLocOption(option);
    }
    /**
     * 开启百度定位
     */
    public void startBaiduLocated(boolean needGeoPoiInfo, LocatedListener locatedListener) {
        initLocation(locatedListener, needGeoPoiInfo);
        mLocationClient.start();// 定位SDK
                                // start之后会默认发起一次定位请求，开发者无须判断isstart并主动调用request
    }
    /**
     * 开启百度定位(临时方法  地址选择页面 登陆成功 定位)
     */
    public void startBaiduLocated2(boolean needGeoPoiInfo, LocatedListener2 locatedListener2) {
        initLocation(locatedListener2, needGeoPoiInfo);
        mLocationClient.start();// 定位SDK
        // start之后会默认发起一次定位请求，开发者无须判断isstart并主动调用request
    }

    /**
     * 关闭百度定位
     */
    public void stopBaiduLocated() {
        if (mLocationClient == null)
            mLocationClient = YMXApplication.getInstance().mLocationClient;
        mLocationClient.stop();
    }
}
